#define _CRT_SECURE_NO_WARNINGS 1


//#include<vector>
//#include<iostream>
//
//using namespace std;
//
//bool Func(vector<vector<int>>& vv1, vector<vector<int>>& vv2)
//{
//    for (int i = 0; i < vv1.size(); i++)
//    {
//        for (int j = 0; j < vv1[i].size(); j++)
//        {
//            if (vv1[i][j] != vv2[i][j])
//            {
//                return true;
//            }
//        }
//    }
//    return false;
//}
//
//int rotApple(vector<vector<int>>& grid)
//{
//    int count = 0;
//    while (1)
//    {
//        vector<vector<int>> vv(grid);
//        vector<int> v1, v2;
//        for (int i = 0; i < grid.size(); i++)
//        {
//            for (int j = 0; j < grid[i].size(); j++)
//            {
//                if (grid[i][j] == 2)
//                {
//                    if (j - 1 >= 0 && grid[i][j - 1] != 0)
//                    {
//                        v1.push_back(i);
//                        v2.push_back(j - 1);
//                    }
//                    if (j + 1 < grid[i].size() && grid[i][j + 1] != 0)
//                    {
//                        v1.push_back(i);
//                        v2.push_back(j + 1);
//                    }
//                    if (i - 1 >= 0 && grid[i - 1][j] != 0)
//                    {
//                        v1.push_back(i - 1);
//                        v2.push_back(j);
//                    }
//                    if (i + 1 < grid.size() && grid[i + 1][j] != 0)
//                    {
//                        v1.push_back(i + 1);
//                        v2.push_back(j);
//                    }
//                }
//            }
//        }
//        for (int i = 0; i < v1.size(); i++)
//        {
//            grid[v1[i]][v2[i]] = 2;
//        }
//        if (!Func(grid, vv))
//        {
//            break;
//        }
//        count++;
//    }
//    for (int i = 0; i < grid.size(); i++)
//    {
//        for (int j = 0; j < grid[i].size(); j++)
//        {
//            if (grid[i][j] == 1)
//            {
//                return -1;
//            }
//        }
//    }
//    return count;
//}
//
//int main()
//{
//    vector<vector<int>> vv = { {2,1,1}, {1,0,1}, {1,1,1} };
//    cout << rotApple(vv) << endl;
//
//    return 0;
//}


#include<list>
#include<iostream>

using namespace std;

int LastRemaining_Solution(int n, int m)
{
    list<int> l1;
    for (int i = 0; i < n; i++)
    {
        l1.push_back(i);
    }
    int rev = -1;
    auto it = l1.begin();
    while (l1.size() != 1)
    {
        for (int j = 0; j < m - 1; j++)
        {
            it++;
            if (it == l1.end())
            {
                it = l1.begin();
            }
        }
        it = l1.erase(it);
        if (it == l1.end())
        {
            it = l1.begin();
        }
    }
    return l1.front();
}

//typedef struct ListNode
//{
//    int val;
//    struct ListNode* next;
//} ListNode;
//
//ListNode* BuyNode(int x)
//{
//    ListNode* node = (ListNode*)malloc(sizeof(ListNode));
//    if (node == NULL)
//    {
//        exit(1);
//    }
//    node->val = x;
//    node->next = NULL;
//    return node;
//}
//
//void ListPushBack(ListNode** pphead, int x)
//{
//    ListNode* NewNode = BuyNode(x);
//    if (NewNode == NULL)
//    {
//        *pphead = NewNode;
//    }
//    else
//    {
//        ListNode* pcur = *pphead;
//        while (pcur->next)
//        {
//            pcur = pcur->next;
//        }
//        pcur->next = NewNode;
//    }
//}
//
//int LastRemaining_Solution(int n, int m)
//{
//    ListNode* plist = NULL;
//    for (int i = 0; i < n; i++)
//    {
//        ListPushBack(&plist, i);
//    }
//    for(int i = 0; i < )
//}

int main()
{
    //printf("%d\n", LastRemaining_Solution(5, 3));
    cout << LastRemaining_Solution(2, 3) << endl;

    return 0;
}